@256
D=A
@SP
M=D
@1
D=A
@LCL
M=D
@2
D=A
@ARG
M=D
@3
D=A
@THIS
M=D
@4
D=A
@THAT
M=D
@bootstrap
D=A
@SP
A=M
M=D
@SP
M=M+1
@LCL
D=M
@SP
A=M
M=D
@SP
M=M+1
@ARG
D=M
@SP
A=M
M=D
@SP
M=M+1
@THIS
D=M
@SP
A=M
M=D
@SP
M=M+1
@THAT
D=M
@SP
A=M
M=D
@SP
M=M+1
@5
D=A
@SP
D=M-D
@ARG
M=D
@SP
D=M
@LCL
M=D
@Sys.init
0;JMP
(bootstrap)

//function Sys.init 0
(Sys.init)

//push constant 6
@6
D=A
@SP
A=M
M=D
@SP
M=M+1

//push constant 8
@8
D=A
@SP
A=M
M=D
@SP
M=M+1

//call Class1.set 2
@End$Class1.set$0
D=A
@SP
A=M
M=D
@SP
M=M+1
@LCL
D=M
@SP
A=M
M=D
@SP
M=M+1
@ARG
D=M
@SP
A=M
M=D
@SP
M=M+1
@THIS
D=M
@SP
A=M
M=D
@SP
M=M+1
@THAT
D=M
@SP
A=M
M=D
@SP
M=M+1
@SP
D=M
@7
AD=D-A
@ARG
M=D
@SP
D=M
@LCL
M=D
@Class1.set
0;JMP
(End$Class1.set$0)

//pop temp 0 
@SP
M=M-1
A=M
D=M
@5
M=D

//push constant 23
@23
D=A
@SP
A=M
M=D
@SP
M=M+1

//push constant 15
@15
D=A
@SP
A=M
M=D
@SP
M=M+1

//call Class2.set 2
@End$Class2.set$0
D=A
@SP
A=M
M=D
@SP
M=M+1
@LCL
D=M
@SP
A=M
M=D
@SP
M=M+1
@ARG
D=M
@SP
A=M
M=D
@SP
M=M+1
@THIS
D=M
@SP
A=M
M=D
@SP
M=M+1
@THAT
D=M
@SP
A=M
M=D
@SP
M=M+1
@SP
D=M
@7
AD=D-A
@ARG
M=D
@SP
D=M
@LCL
M=D
@Class2.set
0;JMP
(End$Class2.set$0)

//pop temp 0 
@SP
M=M-1
A=M
D=M
@5
M=D

//call Class1.get 0
@End$Class1.get$0
D=A
@SP
A=M
M=D
@SP
M=M+1
@LCL
D=M
@SP
A=M
M=D
@SP
M=M+1
@ARG
D=M
@SP
A=M
M=D
@SP
M=M+1
@THIS
D=M
@SP
A=M
M=D
@SP
M=M+1
@THAT
D=M
@SP
A=M
M=D
@SP
M=M+1
@SP
D=M
@5
AD=D-A
@ARG
M=D
@SP
D=M
@LCL
M=D
@Class1.get
0;JMP
(End$Class1.get$0)

//call Class2.get 0
@End$Class2.get$0
D=A
@SP
A=M
M=D
@SP
M=M+1
@LCL
D=M
@SP
A=M
M=D
@SP
M=M+1
@ARG
D=M
@SP
A=M
M=D
@SP
M=M+1
@THIS
D=M
@SP
A=M
M=D
@SP
M=M+1
@THAT
D=M
@SP
A=M
M=D
@SP
M=M+1
@SP
D=M
@5
AD=D-A
@ARG
M=D
@SP
D=M
@LCL
M=D
@Class2.get
0;JMP
(End$Class2.get$0)

//label WHILE
(Sys.init$WHILE)

//goto WHILE
@Sys.init$WHILE
0;JMP

//function Class1.set 0
(Class1.set)

//push argument 0
@ARG
AD=M
D=M
@SP
A=M
M=D
@SP
M=M+1

//pop static 0
@SP
M=M-1
A=M
D=M
@Class1.0
M=D

//push argument 1
@ARG
AD=M
@1
A=D+A
D=M
@SP
A=M
M=D
@SP
M=M+1

//pop static 1
@SP
M=M-1
A=M
D=M
@Class1.1
M=D

//push constant 0
@SP
A=M
M=0
@SP
M=M+1

//return
@LCL
D=M
@R15
M=D
@R15
D=M
@5
AD=D-A
D=M
@R14
M=D
@SP
M=M-1
A=M
D=M
@ARG
A=M
M=D
@ARG
D=M
AD=D+1
@SP
M=D
@R15
D=M
AD=D-1
D=M
@THAT
M=D
@R15
D=M
@2
AD=D-A
D=M
@THIS
M=D
@R15
D=M
@3
AD=D-A
D=M
@ARG
M=D
@R15
D=M
@4
AD=D-A
D=M
@LCL
M=D
@R14
A=M
0;JMP

//function Class1.get 0
(Class1.get)

//push static 0
@Class1.0
D=M
@SP
A=M
M=D
@SP
M=M+1

//push static 1
@Class1.1
D=M
@SP
A=M
M=D
@SP
M=M+1

//sub
@SP
M=M-1
A=M
D=M
@SP
M=M-1
A=M
D=M-D
@SP
A=M
M=D
@SP
M=M+1

//return
@LCL
D=M
@R15
M=D
@R15
D=M
@5
AD=D-A
D=M
@R14
M=D
@SP
M=M-1
A=M
D=M
@ARG
A=M
M=D
@ARG
D=M
AD=D+1
@SP
M=D
@R15
D=M
AD=D-1
D=M
@THAT
M=D
@R15
D=M
@2
AD=D-A
D=M
@THIS
M=D
@R15
D=M
@3
AD=D-A
D=M
@ARG
M=D
@R15
D=M
@4
AD=D-A
D=M
@LCL
M=D
@R14
A=M
0;JMP

//function Class2.set 0
(Class2.set)

//push argument 0
@ARG
AD=M
D=M
@SP
A=M
M=D
@SP
M=M+1

//pop static 0
@SP
M=M-1
A=M
D=M
@Class2.0
M=D

//push argument 1
@ARG
AD=M
@1
A=D+A
D=M
@SP
A=M
M=D
@SP
M=M+1

//pop static 1
@SP
M=M-1
A=M
D=M
@Class2.1
M=D

//push constant 0
@SP
A=M
M=0
@SP
M=M+1

//return
@LCL
D=M
@R15
M=D
@R15
D=M
@5
AD=D-A
D=M
@R14
M=D
@SP
M=M-1
A=M
D=M
@ARG
A=M
M=D
@ARG
D=M
AD=D+1
@SP
M=D
@R15
D=M
AD=D-1
D=M
@THAT
M=D
@R15
D=M
@2
AD=D-A
D=M
@THIS
M=D
@R15
D=M
@3
AD=D-A
D=M
@ARG
M=D
@R15
D=M
@4
AD=D-A
D=M
@LCL
M=D
@R14
A=M
0;JMP

//function Class2.get 0
(Class2.get)

//push static 0
@Class2.0
D=M
@SP
A=M
M=D
@SP
M=M+1

//push static 1
@Class2.1
D=M
@SP
A=M
M=D
@SP
M=M+1

//sub
@SP
M=M-1
A=M
D=M
@SP
M=M-1
A=M
D=M-D
@SP
A=M
M=D
@SP
M=M+1

//return
@LCL
D=M
@R15
M=D
@R15
D=M
@5
AD=D-A
D=M
@R14
M=D
@SP
M=M-1
A=M
D=M
@ARG
A=M
M=D
@ARG
D=M
AD=D+1
@SP
M=D
@R15
D=M
AD=D-1
D=M
@THAT
M=D
@R15
D=M
@2
AD=D-A
D=M
@THIS
M=D
@R15
D=M
@3
AD=D-A
D=M
@ARG
M=D
@R15
D=M
@4
AD=D-A
D=M
@LCL
M=D
@R14
A=M
0;JMP